package netty.tcp;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import java.util.concurrent.TimeUnit;

/**
 * @Description 自定义一个Handler需要继承ChannelInboundHandlerAdapter
 * @Author 李龙平
 * @Date 2020/10/12 10:26
 */

public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    //读取数据（可以读取客服端发送的消息）

    /**
     * @param ctx 上下文对象 可以获取到 管道pipeline 通道 地址
     * @param msg 客服端发送的数据
     * @throws Exception e
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        //将msg转ByteBuf
//        ByteBuf buf = (ByteBuf)msg;
//        System.out.println("客服端发送的数据是" + buf.toString(CharsetUtil.UTF_8));
        /* *
            当业务非常耗时时 》异步执行 》 提交到channel的NioEventLoop的 taskQueue中
         */

//        TimeUnit.SECONDS.sleep(10);
//        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客服端2", CharsetUtil.UTF_8));
        /* *
            hello 客服端会先返回客服端 hello 客服端2后返回
         */
        ctx.channel().eventLoop().execute(() ->{
            try {
                TimeUnit.SECONDS.sleep(10);
                ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客服端2", CharsetUtil.UTF_8));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        ctx.channel().eventLoop().execute(() ->{
            try {
                TimeUnit.SECONDS.sleep(20);
                //这个是任务队列  所以 hello 客服端3会在 30s后发送  这是同一个线程执行
                ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客服端3", CharsetUtil.UTF_8));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        //用户自定义定时任务 提交到 scheduleTaskQueue

        ctx.channel().eventLoop().schedule(() ->{
            try {
                TimeUnit.SECONDS.sleep(20);
                //这个是任务队列  所以 hello 客服端3会在 30s后发送  这是同一个线程执行
                ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客服端4", CharsetUtil.UTF_8));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, 5, TimeUnit.SECONDS);

    }

    //数据读取完毕

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客服端", CharsetUtil.UTF_8));
    }

    //处理异常

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //发生异常时 关闭通道
        ctx.close();
    }
}
